css: Add GTK_CSS_AFFECTS_ICON_SIZE
authorTimm Bäder <mail@baedert.org>
Sat, 14 Oct 2017 12:58:53 +0000 (14:58 +0200)
committerTimm Bäder <mail@baedert.org>
Sat, 14 Oct 2017 15:27:55 +0000 (17:27 +0200)
And use it in GtkIconHelper. This way, we can avoid resizes when e.g.
the fg color of a symbolic icon changes.

gtk/gtkcssstylepropertyimpl.c
gtk/gtkcsstypesprivate.h
gtk/gtkiconhelper.c

index c68268e6032917f4e01243ad2323a26eacbc7b1f..8f714d80fae5b2c03c6fb321cc29e6746a97dd3a 100644 (file)
@@ -1033,7 +1033,7 @@ _gtk_css_style_property_init_properties (void)
                                           GTK_CSS_PROPERTY_ICON_THEME,
                                           G_TYPE_NONE,
                                           GTK_STYLE_PROPERTY_INHERIT,
-                                          GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
+                                          GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON | GTK_CSS_AFFECTS_ICON_SIZE,
                                           icon_theme_value_parse,
                                           NULL,
                                           gtk_css_icon_theme_value_new (NULL));
@@ -1592,7 +1592,7 @@ _gtk_css_style_property_init_properties (void)
                                           GTK_CSS_PROPERTY_ICON_STYLE,
                                           G_TYPE_NONE,
                                           GTK_STYLE_PROPERTY_INHERIT,
-                                          GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
+                                          GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON | GTK_CSS_AFFECTS_ICON_SIZE,
                                           icon_style_parse,
                                           NULL,
                                           _gtk_css_icon_style_value_new (GTK_CSS_ICON_STYLE_REQUESTED));
index 1e431729e4a8125a64edba2791c9203298f0541e..a173f55d134bc38cce15e5f0a2a76bc8bac37bb1 100644 (file)
@@ -127,6 +127,7 @@ typedef enum {
   GTK_CSS_AFFECTS_CONTENT       = (1 << 0),
   GTK_CSS_AFFECTS_BACKGROUND    = (1 << 1),
   GTK_CSS_AFFECTS_BORDER        = (1 << 2),
+  GTK_CSS_AFFECTS_ICON_SIZE     = (1 << 3),
   GTK_CSS_AFFECTS_TEXT_ATTRS    = (1 << 4),
   GTK_CSS_AFFECTS_TEXT_SIZE     = (1 << 5),
   GTK_CSS_AFFECTS_TEXT_CLIP     = (1 << 6),
index 5fe768995bfadfe21427362c2fbfd514e320a409..484c022ace5ce0d6139e07f05dc323472a651232 100644 (file)
@@ -60,7 +60,20 @@ gtk_icon_helper_invalidate_for_change (GtkIconHelper     *self,
        (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_ICON) &&
         !self->rendered_surface_is_symbolic)))
     {
-      gtk_icon_helper_invalidate (self);
+      /* Avoid the queue_resize in gtk_icon_helper_invalidate */
+      g_clear_object (&self->texture);
+
+      if (self->rendered_surface != NULL)
+        {
+          cairo_surface_destroy (self->rendered_surface);
+          self->rendered_surface = NULL;
+          self->rendered_surface_is_symbolic = FALSE;
+        }
+
+      if (change == NULL ||
+          (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_ICON_SIZE) &&
+          !GTK_IS_CSS_TRANSIENT_NODE (self->node)))
+        gtk_widget_queue_resize (self->owner);
     }
 }